--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tests/backend/test_rrc_moderation.py 17e20e7724b25d4e2fc9b2195a36ff57b6a75189 (17e20e77) Text, 10.35 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Tests for RRC hub moderation, room modes, and rooms.toml persistence."""
Tff7b72import T7ee787os
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrc Tff7b72import Te6edf3protocol Tff7b72as Te6edf3proto
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787hub_policy Tff7b72import Te6edf3load_hub_policyTb4b4b4, Te6edf3save_hub_policy
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787identity_util Tff7b72import Te6edf3parse_identity_hash
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787rooms_toml Tff7b72import Te6edf3RoomsTomlStoreTb4b4b4, Te6edf3load_rooms_registry
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787server Tff7b72import Te6edf3RRCHubServerTb4b4b4, Te6edf3RRCServerManagerTb4b4b4, Te6edf3_Session
Tff7b72class T56d364FakeIdentityTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hash_bytesTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhash Tff7b72= Te6edf3hash_bytes
Tff7b72class T56d364FakeLinkTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_identity Tff7b72= Te6edf3identity
Tff7b72def Td2a8ffget_remote_identityTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_identity
Tff7b72class T56d364FakeManagerTb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffchanges Tff7b72= T79c0ff0
Tff7b72def Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffchanges Tff7b72+Tff7b72= T79c0ff1
Tff7b72def Td2a8ffsaveTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72pass
Te6edf3ALICE Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x01Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3BOB Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x02Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3CAROL Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x03Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3HUB_HASH Tff7b72= Tffa657bytesTb4b4b4(Tffa657rangeTb4b4b4(T79c0ff16Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffmake_serverTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3trustedTff7b72=Tff7b72NoneTb4b4b4, Te6edf3bannedTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3server Tff7b72= Te6edf3RRCHubServerTb4b4b4(Te6edf3FakeManagerTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3FakeIdentityTb4b4b4(Te6edf3HUB_HASHTb4b4b4)Tb4b4b4, Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffMod HubTa5d6ff"Tb4b4b4)
Te6edf3hub_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffhubTa5d6ff"
Te6edf3serverTff7b72.Td2a8ffconfigure_storageTb4b4b4(Tffa657strTb4b4b4(Te6edf3hub_dirTb4b4b4)Tb4b4b4, Te6edf3trustedTff7b72=Te6edf3trustedTb4b4b4, Te6edf3bannedTff7b72=Te6edf3bannedTb4b4b4)
Tff7b72return Te6edf3server
Tff7b72def Td2a8ffadd_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3peer_hashTb4b4b4, Te6edf3nickTff7b72=Tff7b72NoneTb4b4b4, Te6edf3welcomedTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Te6edf3sess Tff7b72= Te6edf3_SessionTb4b4b4(Tb4b4b4)
Te6edf3sessTff7b72.Td2a8ffpeer Tff7b72= Te6edf3peer_hash
Te6edf3sessTff7b72.Td2a8ffnick Tff7b72= Te6edf3nick
Te6edf3sessTff7b72.Td2a8ffwelcomed Tff7b72= Te6edf3welcomed
Te6edf3serverTff7b72.Td2a8ff_sessionsTb4b4b4[Te6edf3linkTb4b4b4] Tff7b72= Te6edf3sess
Tff7b72return Te6edf3sess
Tff7b72def Td2a8ffrouteTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4)Tb4b4b4:
Te6edf3outgoing Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3serverTff7b72.Td2a8ff_routeTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4, Te6edf3outgoingTb4b4b4)
Tff7b72return Tb4b4b4[Tb4b4b4(Te6edf3out_linkTb4b4b4, Te6edf3protoTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3payloadTb4b4b4)Tb4b4b4) Tff7b72for Te6edf3out_linkTb4b4b4, Te6edf3payload Tff7b72in Te6edf3outgoingTb4b4b4]
Tff7b72def Td2a8ffjoinTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3keyTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3body Tff7b72= Te6edf3key Tff7b72if Te6edf3key Tff7b72else Tff7b72None
Te6edf3routeTb4b4b4(
Te6edf3serverTb4b4b4,
Te6edf3linkTb4b4b4,
Te6edf3sessTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(Te6edf3protoTff7b72.Td2a8ffT_JOINTb4b4b4, Te6edf3srcTff7b72=Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4, Te6edf3roomTff7b72=Te6edf3roomTb4b4b4, Te6edf3bodyTff7b72=Te6edf3bodyTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ffmsgTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3textTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3routeTb4b4b4(
Te6edf3serverTb4b4b4,
Te6edf3linkTb4b4b4,
Te6edf3sessTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(Te6edf3protoTff7b72.Td2a8ffT_MSGTb4b4b4, Te6edf3srcTff7b72=Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4, Te6edf3roomTff7b72=Te6edf3roomTb4b4b4, Te6edf3bodyTff7b72=Te6edf3textTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_kline_bans_and_persistsTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3server Tff7b72= Te6edf3make_serverTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3trustedTff7b72=Tb4b4b4[Te6edf3ALICETff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4)
Te6edf3link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3ALICETb4b4b4)Tb4b4b4)
Te6edf3sess Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3ALICETb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4)
Te6edf3joinTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Te6edf3out Tff7b72= Te6edf3msgTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ff/kline add Tffd700{Te6edf3BOBTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3notice Tff7b72= Tb4b4b4[Te6edf3e Tff7b72for Te6edf3_Tb4b4b4, Te6edf3e Tff7b72in Te6edf3out Tff7b72if Te6edf3eTb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_TTb4b4b4] Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_NOTICETb4b4b4]
Tff7b72assert Te6edf3notice
Tff7b72assert Ta5d6ff"Ta5d6ffkline addedTa5d6ff" Tff7b72in Te6edf3noticeTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_BODYTb4b4b4]
Te6edf3trustedTb4b4b4, Te6edf3banned Tff7b72= Te6edf3load_hub_policyTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffhubTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffhub.tomlTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3BOB Tff7b72in Te6edf3banned
Te6edf3bob_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3BOBTb4b4b4)Tb4b4b4)
Te6edf3serverTff7b72.Td2a8ff_on_remote_identifiedTb4b4b4(Te6edf3bob_linkTb4b4b4, Te6edf3bob_linkTff7b72.Td2a8ff_identityTb4b4b4)
Tff7b72assert Tb4b4b4(
Te6edf3bob_link Tff7b72not Tff7b72in Te6edf3serverTff7b72.Td2a8ff_sessions
Tff7b72or Te6edf3serverTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffgetTb4b4b4(Te6edf3bob_linkTb4b4b4) Tff7b72is Tff7b72None
Tff7b72or Tff7b72True
Tb4b4b4)
Tff7b72def Td2a8fftest_room_ban_blocks_joinTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3server Tff7b72= Te6edf3make_serverTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3trustedTff7b72=Tb4b4b4[Te6edf3ALICETff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4)
Te6edf3serverTff7b72.Td2a8ffregister_roomTb4b4b4(Ta5d6ff"Ta5d6ffsecretTa5d6ff"Tb4b4b4, Te6edf3privateTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3serverTff7b72.Td2a8ffroomsTff7b72.Td2a8ffensure_stateTb4b4b4(Ta5d6ff"Ta5d6ffsecretTa5d6ff"Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffbansTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffaddTb4b4b4(Te6edf3BOBTb4b4b4)
Te6edf3alice_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3ALICETb4b4b4)Tb4b4b4)
Te6edf3alice Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3ALICETb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4)
Te6edf3joinTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3aliceTb4b4b4, Ta5d6ff"Ta5d6ffsecretTa5d6ff"Tb4b4b4)
Te6edf3bob_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3BOBTb4b4b4)Tb4b4b4)
Te6edf3bob Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3bob_linkTb4b4b4, Te6edf3BOBTb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffbobTa5d6ff"Tb4b4b4)
Te6edf3out Tff7b72= Te6edf3routeTb4b4b4(
Te6edf3serverTb4b4b4,
Te6edf3bob_linkTb4b4b4,
Te6edf3bobTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(Te6edf3protoTff7b72.Td2a8ffT_JOINTb4b4b4, Te6edf3srcTff7b72=Te6edf3BOBTb4b4b4, Te6edf3roomTff7b72=Ta5d6ff"Ta5d6ffsecretTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72assert Te6edf3outTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_TTb4b4b4] Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_ERROR
Tff7b72assert Ta5d6ff"Ta5d6ffbannedTa5d6ff" Tff7b72in Te6edf3outTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_BODYTb4b4b4]
Tff7b72def Td2a8fftest_moderated_room_requires_voiceTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3server Tff7b72= Te6edf3make_serverTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3trustedTff7b72=Tb4b4b4[Te6edf3ALICETff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4)
Te6edf3serverTff7b72.Td2a8ffregister_roomTb4b4b4(Ta5d6ff"Ta5d6ffchatTa5d6ff"Tb4b4b4, Te6edf3moderatedTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3alice_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3ALICETb4b4b4)Tb4b4b4)
Te6edf3alice Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3ALICETb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4)
Te6edf3joinTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3aliceTb4b4b4, Ta5d6ff"Ta5d6ffchatTa5d6ff"Tb4b4b4)
Te6edf3bob_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3BOBTb4b4b4)Tb4b4b4)
Te6edf3bob Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3bob_linkTb4b4b4, Te6edf3BOBTb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffbobTa5d6ff"Tb4b4b4)
Te6edf3joinTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3bob_linkTb4b4b4, Te6edf3bobTb4b4b4, Ta5d6ff"Ta5d6ffchatTa5d6ff"Tb4b4b4)
Te6edf3out Tff7b72= Te6edf3msgTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3bob_linkTb4b4b4, Te6edf3bobTb4b4b4, Ta5d6ff"Ta5d6ffchatTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhelloTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3outTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_TTb4b4b4] Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_ERROR
Tff7b72assert Ta5d6ff"Ta5d6ff+mTa5d6ff" Tff7b72in Te6edf3outTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_BODYTb4b4b4]
Te6edf3msgTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3aliceTb4b4b4, Ta5d6ff"Ta5d6ffchatTa5d6ff"Tb4b4b4, Ta5d6fffTa5d6ff"Ta5d6ff/voice chat Tffd700{Te6edf3BOBTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff12Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3out2 Tff7b72= Te6edf3msgTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3bob_linkTb4b4b4, Te6edf3bobTb4b4b4, Ta5d6ff"Ta5d6ffchatTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnow okTa5d6ff"Tb4b4b4)
Te6edf3fanout Tff7b72= Tb4b4b4[Te6edf3e Tff7b72for Te6edf3_Tb4b4b4, Te6edf3e Tff7b72in Te6edf3out2 Tff7b72if Te6edf3eTb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_TTb4b4b4] Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_MSGTb4b4b4]
Tff7b72assert Te6edf3fanout
Tff7b72def Td2a8fftest_invite_only_requires_inviteTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3server Tff7b72= Te6edf3make_serverTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3trustedTff7b72=Tb4b4b4[Te6edf3ALICETff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4)
Te6edf3serverTff7b72.Td2a8ffregister_roomTb4b4b4(Ta5d6ff"Ta5d6ffvipTa5d6ff"Tb4b4b4, Te6edf3invite_onlyTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3alice_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3ALICETb4b4b4)Tb4b4b4)
Te6edf3alice Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3ALICETb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4)
Te6edf3joinTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3aliceTb4b4b4, Ta5d6ff"Ta5d6ffvipTa5d6ff"Tb4b4b4)
Te6edf3bob_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3BOBTb4b4b4)Tb4b4b4)
Te6edf3bob Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3bob_linkTb4b4b4, Te6edf3BOBTb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffbobTa5d6ff"Tb4b4b4)
Te6edf3out Tff7b72= Te6edf3routeTb4b4b4(
Te6edf3serverTb4b4b4,
Te6edf3bob_linkTb4b4b4,
Te6edf3bobTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(Te6edf3protoTff7b72.Td2a8ffT_JOINTb4b4b4, Te6edf3srcTff7b72=Te6edf3BOBTb4b4b4, Te6edf3roomTff7b72=Ta5d6ff"Ta5d6ffvipTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff+iTa5d6ff" Tff7b72in Te6edf3outTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_BODYTb4b4b4]
Te6edf3msgTb4b4b4(
Te6edf3serverTb4b4b4,
Te6edf3alice_linkTb4b4b4,
Te6edf3aliceTb4b4b4,
Ta5d6ff"Ta5d6ffvipTa5d6ff"Tb4b4b4,
Ta5d6fffTa5d6ff"Ta5d6ff/invite vip add Tffd700{Te6edf3BOBTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff12Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3out2 Tff7b72= Te6edf3routeTb4b4b4(
Te6edf3serverTb4b4b4,
Te6edf3bob_linkTb4b4b4,
Te6edf3bobTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(Te6edf3protoTff7b72.Td2a8ffT_JOINTb4b4b4, Te6edf3srcTff7b72=Te6edf3BOBTb4b4b4, Te6edf3roomTff7b72=Ta5d6ff"Ta5d6ffvipTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3joined Tff7b72= Tb4b4b4[Te6edf3e Tff7b72for Te6edf3_Tb4b4b4, Te6edf3e Tff7b72in Te6edf3out2 Tff7b72if Te6edf3eTb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_TTb4b4b4] Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_JOINEDTb4b4b4]
Tff7b72assert Te6edf3joined
Tff7b72def Td2a8fftest_keyed_room_requires_keyTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3server Tff7b72= Te6edf3make_serverTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3trustedTff7b72=Tb4b4b4[Te6edf3ALICETff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4)
Te6edf3serverTff7b72.Td2a8ffregister_roomTb4b4b4(Ta5d6ff"Ta5d6fflockedTa5d6ff"Tb4b4b4, Te6edf3keyTff7b72=Ta5d6ff"Ta5d6ffs3cretTa5d6ff"Tb4b4b4)
Te6edf3alice_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3ALICETb4b4b4)Tb4b4b4)
Te6edf3alice Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3ALICETb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4)
Te6edf3joinTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3aliceTb4b4b4, Ta5d6ff"Ta5d6fflockedTa5d6ff"Tb4b4b4)
Te6edf3bob_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3BOBTb4b4b4)Tb4b4b4)
Te6edf3bob Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3bob_linkTb4b4b4, Te6edf3BOBTb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffbobTa5d6ff"Tb4b4b4)
Te6edf3out Tff7b72= Te6edf3routeTb4b4b4(
Te6edf3serverTb4b4b4,
Te6edf3bob_linkTb4b4b4,
Te6edf3bobTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(Te6edf3protoTff7b72.Td2a8ffT_JOINTb4b4b4, Te6edf3srcTff7b72=Te6edf3BOBTb4b4b4, Te6edf3roomTff7b72=Ta5d6ff"Ta5d6fflockedTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff+kTa5d6ff" Tff7b72in Te6edf3outTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_BODYTb4b4b4]
Te6edf3out2 Tff7b72= Te6edf3routeTb4b4b4(
Te6edf3serverTb4b4b4,
Te6edf3bob_linkTb4b4b4,
Te6edf3bobTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(Te6edf3protoTff7b72.Td2a8ffT_JOINTb4b4b4, Te6edf3srcTff7b72=Te6edf3BOBTb4b4b4, Te6edf3roomTff7b72=Ta5d6ff"Ta5d6fflockedTa5d6ff"Tb4b4b4, Te6edf3bodyTff7b72=Ta5d6ff"Ta5d6ffs3cretTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72assert Tb4b4b4[Te6edf3e Tff7b72for Te6edf3_Tb4b4b4, Te6edf3e Tff7b72in Te6edf3out2 Tff7b72if Te6edf3eTb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_TTb4b4b4] Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_JOINEDTb4b4b4]
Tff7b72def Td2a8fftest_kick_removes_from_roomTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3server Tff7b72= Te6edf3make_serverTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3trustedTff7b72=Tb4b4b4[Te6edf3ALICETff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4)
Te6edf3alice_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3ALICETb4b4b4)Tb4b4b4)
Te6edf3alice Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3ALICETb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4)
Te6edf3bob_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3BOBTb4b4b4)Tb4b4b4)
Te6edf3bob Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3bob_linkTb4b4b4, Te6edf3BOBTb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffbobTa5d6ff"Tb4b4b4)
Te6edf3joinTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3aliceTb4b4b4, Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Te6edf3joinTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3bob_linkTb4b4b4, Te6edf3bobTb4b4b4, Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Te6edf3msgTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3aliceTb4b4b4, Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/kick lobby bobTa5d6ff"Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6fflobbyTa5d6ff" Tff7b72not Tff7b72in Te6edf3bobTff7b72.Td2a8ffrooms
Tff7b72def Td2a8fftest_mode_sets_moderated_and_persists_tomlTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3server Tff7b72= Te6edf3make_serverTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3trustedTff7b72=Tb4b4b4[Te6edf3ALICETff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4)
Te6edf3serverTff7b72.Td2a8ffregister_roomTb4b4b4(Ta5d6ff"Ta5d6ffgeneralTa5d6ff"Tb4b4b4)
Te6edf3alice_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3ALICETb4b4b4)Tb4b4b4)
Te6edf3alice Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3ALICETb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4)
Te6edf3joinTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3aliceTb4b4b4, Ta5d6ff"Ta5d6ffgeneralTa5d6ff"Tb4b4b4)
Te6edf3msgTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3aliceTb4b4b4, Ta5d6ff"Ta5d6ffgeneralTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/mode general +mTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3serverTff7b72.Td2a8ffroomsTff7b72.Td2a8ffis_room_moderatedTb4b4b4(Ta5d6ff"Ta5d6ffgeneralTa5d6ff"Tb4b4b4)
Te6edf3rooms_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffhubTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffrooms.tomlTa5d6ff"Tb4b4b4)
Te6edf3reg Tff7b72= Te6edf3load_rooms_registryTb4b4b4(Te6edf3rooms_pathTb4b4b4)
Tff7b72assert Te6edf3regTb4b4b4[Ta5d6ff"Ta5d6ffgeneralTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72def Td2a8fftest_register_and_unregister_roomTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3server Tff7b72= Te6edf3make_serverTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Te6edf3alice_link Tff7b72= Te6edf3FakeLinkTb4b4b4(Te6edf3FakeIdentityTb4b4b4(Te6edf3ALICETb4b4b4)Tb4b4b4)
Te6edf3alice Tff7b72= Te6edf3add_sessionTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3ALICETb4b4b4, Te6edf3nickTff7b72=Ta5d6ff"Ta5d6ffaliceTa5d6ff"Tb4b4b4)
Te6edf3joinTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3aliceTb4b4b4, Ta5d6ff"Ta5d6ffnewroomTa5d6ff"Tb4b4b4)
Te6edf3msgTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3aliceTb4b4b4, Ta5d6ff"Ta5d6ffnewroomTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/register newroomTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3serverTff7b72.Td2a8ffroomsTff7b72.Td2a8ffensure_stateTb4b4b4(Ta5d6ff"Ta5d6ffnewroomTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72True
Te6edf3msgTb4b4b4(Te6edf3serverTb4b4b4, Te6edf3alice_linkTb4b4b4, Te6edf3aliceTb4b4b4, Ta5d6ff"Ta5d6ffnewroomTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff/unregister newroomTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3serverTff7b72.Td2a8ffroomsTff7b72.Td2a8ffensure_stateTb4b4b4(Ta5d6ff"Ta5d6ffnewroomTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False
Tff7b72def Td2a8fftest_create_hub_auto_trusts_owner_identityTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3RRCServerManagerTb4b4b4(
Te6edf3storage_dirTff7b72=Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4,
Te6edf3owner_identityTff7b72=Te6edf3ALICETb4b4b4,
Tb4b4b4)
Te6edf3hub Tff7b72= Te6edf3managerTff7b72.Td2a8ffcreate_hubTb4b4b4(Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffOwned HubTa5d6ff"Tb4b4b4, Te6edf3enabledTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72assert Te6edf3hubTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffis_trustedTb4b4b4(Te6edf3ALICETb4b4b4)
Tff7b72assert Te6edf3ALICETff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4) Tff7b72in Te6edf3hubTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffto_dictTb4b4b4(Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6fftrusted_identitiesTa5d6ff"Tb4b4b4]
Tff7b72def Td2a8fftest_server_manager_roundtrip_policy_and_roomsTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3manager Tff7b72= Te6edf3RRCServerManagerTb4b4b4(Te6edf3storage_dirTff7b72=Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4, Te6edf3owner_identityTff7b72=Te6edf3ALICETb4b4b4)
Te6edf3hub Tff7b72= Te6edf3RRCHubServerTb4b4b4(Te6edf3managerTb4b4b4, Te6edf3FakeIdentityTb4b4b4(Te6edf3HUB_HASHTb4b4b4)Tb4b4b4, Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffPersist HubTa5d6ff"Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3managerTff7b72.Td2a8ff_server_dirTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3ident_path Tff7b72= Te6edf3managerTff7b72.Td2a8ff_identity_pathTb4b4b4(Te6edf3HUB_HASHTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3ident_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ffbTa5d6ff"Tffea00\x00Ta5d6ff" Tff7b72* T79c0ff64Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffconfigure_storageTb4b4b4(Tffa657strTb4b4b4(Te6edf3managerTff7b72.Td2a8ff_hub_dirTb4b4b4(Te6edf3HUB_HASHTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3managerTff7b72.Td2a8ffhubsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3hubTb4b4b4)
Te6edf3hubTff7b72.Td2a8ffpolicyTff7b72.Td2a8fftrustedTff7b72.Td2a8ffaddTb4b4b4(Te6edf3ALICETb4b4b4)
Te6edf3hubTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffregister_roomTb4b4b4(
Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4,
Te6edf3topicTff7b72=Ta5d6ff"Ta5d6ffMainTa5d6ff"Tb4b4b4,
Te6edf3moderatedTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3invite_onlyTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3privateTff7b72=Tff7b72FalseTb4b4b4,
Tb4b4b4)
Te6edf3managerTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Te6edf3manager2 Tff7b72= Te6edf3RRCServerManagerTb4b4b4(Te6edf3storage_dirTff7b72=Tffa657strTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4)
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3patch
Tff7b72import T7ee787RNS
Tff7b72class T56d364_IdentTb4b4b4:
Tffa657hash Tff7b72= Te6edf3HUB_HASH
Tff7b72with Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4, Ta5d6ff"Ta5d6fffrom_fileTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Te6edf3_IdentTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3manager2Tff7b72.Td2a8ffloadTb4b4b4(Tb4b4b4)
Te6edf3loaded Tff7b72= Te6edf3manager2Tff7b72.Td2a8fffind_hubTb4b4b4(Te6edf3HUB_HASHTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3loaded Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3loadedTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffis_trustedTb4b4b4(Te6edf3ALICETb4b4b4)
Tff7b72assert Te6edf3loadedTff7b72.Td2a8ffroomsTff7b72.Td2a8ffis_room_moderatedTb4b4b4(Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8fftest_parse_identity_hash_accepts_0x_prefixTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3h Tff7b72= Te6edf3parse_identity_hashTb4b4b4(Ta5d6ff"Ta5d6ff0xTa5d6ff" Tff7b72+ Tb4b4b4(Ta5d6ff"Ta5d6ffabTa5d6ff" Tff7b72* T79c0ff32Tb4b4b4)Tb4b4b4)
Tff7b72assert Te6edf3h Tff7b72== Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Ta5d6ff"Ta5d6ffabTa5d6ff" Tff7b72* T79c0ff32Tb4b4b4)
Tff7b72def Td2a8fftest_hub_policy_save_load_roundtripTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3path Tff7b72= Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffhub.tomlTa5d6ff"Tb4b4b4)
Te6edf3trusted Tff7b72= Tb4b4b4{Te6edf3ALICETb4b4b4}
Te6edf3banned Tff7b72= Tb4b4b4{Te6edf3BOBTb4b4b4}
Te6edf3save_hub_policyTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3trustedTb4b4b4, Te6edf3bannedTb4b4b4)
Te6edf3tTb4b4b4, Te6edf3b Tff7b72= Te6edf3load_hub_policyTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72assert Te6edf3ALICE Tff7b72in Te6edf3t
Tff7b72assert Te6edf3BOB Tff7b72in Te6edf3b
Tff7b72def Td2a8fftest_rooms_toml_roundtripTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3path Tff7b72= Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffrooms.tomlTa5d6ff"Tb4b4b4)
Te6edf3store Tff7b72= Te6edf3RoomsTomlStoreTb4b4b4(Te6edf3pathTb4b4b4)
Te6edf3reg Tff7b72= Tb4b4b4{
Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6fffounderTa5d6ff"Tb4b4b4: Te6edf3ALICETb4b4b4,
Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffHiTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4: Tff7b72TrueTb4b4b4,
Ta5d6ff"Ta5d6ffinvite_onlyTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6fftopic_ops_onlyTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffno_outside_msgsTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffprivateTa5d6ff"Tb4b4b4: Tff7b72FalseTb4b4b4,
Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4: Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffopsTa5d6ff"Tb4b4b4: Tb4b4b4{Te6edf3ALICETb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffvoicedTa5d6ff"Tb4b4b4: Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffbansTa5d6ff"Tb4b4b4: Tb4b4b4{Te6edf3BOBTb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffinvitedTa5d6ff"Tb4b4b4: Tb4b4b4{Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6fflast_used_tsTa5d6ff"Tb4b4b4: T79c0ff1.0Tb4b4b4,
Tb4b4b4}
Tb4b4b4}
Te6edf3storeTff7b72.Td2a8ffsaveTb4b4b4(Te6edf3regTb4b4b4)
Te6edf3loaded Tff7b72= Te6edf3storeTff7b72.Td2a8ffloadTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3loadedTb4b4b4[Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3BOB Tff7b72in Te6edf3loadedTb4b4b4[Ta5d6ff"Ta5d6fflobbyTa5d6ff"Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffbansTa5d6ff"Tb4b4b4]
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────